package com.aifast.common.properties;

import com.zaxxer.hikari.HikariDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * mysql HikariCP 链接信息参数配置类
 * 说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可
 */
@Component
@ConfigurationProperties(prefix = "spring.datasource")
@Data
public class Setting {

    private String url = "jdbc:mysql://localhost:3306/ai3?useUnicode=true&characterEncoding=utf8&serverTimezone=Hongkong&useSSL=false&allowPublicKeyRetrieval=true";

    private String username = "root";

    private String password = "root";

    private String driverClassName = "com.mysql.cj.jdbc.Driver";

    /**自动提交*/
    private Boolean autoCommit = true;

    /**等待连接池分配连接的最大时长（毫秒），超过这个时长还没可用的连接则发生SQLException， 缺省:30秒*/
    private int connectionTimeout = 30000;

    /**一个连接idle状态的最大时长（毫秒），超时则被释放（retired），缺省:10分钟*/
    private int idleTimeout = 600000;

    /**一个连接的生命时长（毫秒），超时而且没被使用则被释放（retired），缺省:30分钟，建议设置比数据库超时时长少30秒，参考MySQL wait_timeout参数（show variables like '%timeout%';）*/
    private int maxLifetime = 1800000;

    /**获取连接前的测试SQL*/
    private String connectionTestQuery =  "SELECT 1";

    /**
     * 最小闲置连接数
     */
    private int minimumIdle = 1;

    /**
     * 连接池中允许的最大连接数。缺省值：10；推荐的公式：((core_count * 2) + effective_spindle_count)
     */
    private int maximumPoolSize = 10;

    /**
     * 连接只读数据库时配置为true， 保证安全
     */
    private Boolean readOnly = false;

    private Boolean autoCache = false;

    public void init(HikariDataSource ds) {
        ds.setJdbcUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setDriverClassName(driverClassName);

        ds.setAutoCommit(autoCommit);
        ds.setConnectionTimeout(connectionTimeout);
        ds.setIdleTimeout(idleTimeout);
        ds.setMaxLifetime(maxLifetime);
        ds.setConnectionTestQuery(connectionTestQuery);
        ds.setMinimumIdle(minimumIdle);
        ds.setMaximumPoolSize(maximumPoolSize);
        ds.setReadOnly(readOnly);
    }


}
